home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / mods / makers / octamedv4_dev.lha / ProPlayer / pro8player.a < prev    next >
Encoding:
Text File  |  1993-06-15  |  66.6 KB  |  2,002 lines

  1. ;============================================================================
  2. ;   pro8player.a     © Fully Copyrighted
  3. ;   ~~~~~~~~~~~
  4. ; $VER: pro8player 5.002 (09.06.1993)
  5. ;
  6. ; The music player routine for MMD0/MMD1/MMD2 MED/OctaMED
  7. ; eight channel modules.
  8. ;
  9. ; Written by Teijo Kinnunen.
  10. ; If you find bugs in this routine, please notify:
  11. ;   Teijo Kinnunen
  12. ;   Oksantie 19
  13. ;   FIN-86300  OULAINEN
  14. ;   FINLAND
  15. ;
  16. ; THIS CODE MAY BE FREELY USED AND DISTRIBUTED AS PUBLIC DOMAIN ONLY!
  17. ; IF USED FOR ANY PROFIT,PLEASE SEE THE ReadMe FILE.
  18. ;============================================================================
  19.  
  20. ;****** Feature control ******
  21. ;
  22. AUDDEV      EQU 1   ;1 = allocate channels using audio.device
  23. CHECK       EQU 1   ;1 = do range checkings (track, sample in mem etc.)
  24. IFFMOCT     EQU 1   ;1 = play IFF multi-octave samples correctly
  25. HOLD        EQU 1   ;1 = handle hold/decay
  26. PLAYMMD0    EQU 1   ;1 = play old MMD0 modules
  27. ;============================================================================
  28.  
  29. ; The MMD structure offsets
  30. mmd_id      EQU 0
  31. mmd_modlen  EQU 4
  32. mmd_songinfo    EQU 8
  33. ; these two for MMD2s only!
  34. mmd_psecnum EQU 12
  35. mmd_pseq    EQU 14
  36. ;
  37. mmd_blockarr    EQU 16
  38. mmd_smplarr EQU 24
  39. mmd_expdata EQU 32
  40. mmd_pstate  EQU 40 ; <0 = play song, 0 = don't play, >0 = play block
  41. mmd_pblock  EQU 42
  42. mmd_pline   EQU 44
  43. mmd_pseqnum EQU 46
  44. mmd_actplayline EQU 48
  45. mmd_counter EQU 50
  46. mmd_songsleft   EQU 51
  47.  
  48. ; The Song structure
  49. ; Instrument data here (504 bytes = 63 * 8)
  50. msng_numblocks  EQU 504
  51. msng_songlen    EQU 506
  52. msng_playseq    EQU 508
  53. msng_deftempo   EQU 764
  54. msng_playtransp EQU 766
  55. msng_flags  EQU 767
  56. msng_flags2 EQU 768
  57. msng_tempo2 EQU 769
  58. ; msng_trkvol applies to MMD0/MMD1 only.
  59. msng_trkvol EQU 770
  60. msng_mastervol  EQU 786
  61. msng_numsamples EQU 787
  62. ; Fields below apply to MMD2 modules only.
  63. msng_pseqs  EQU 508
  64. msng_sections   EQU 512
  65. msng_trkvoltbl  EQU 516
  66. msng_numtracks  EQU 520
  67. msng_numpseqs   EQU 522
  68.  
  69. ; Instrument data
  70. inst_repeat EQU 0
  71. inst_replen EQU 2
  72. inst_midich EQU 4
  73. inst_midipreset EQU 5
  74. inst_svol   EQU 6
  75. inst_strans EQU 7
  76.  
  77. ; Audio hardware offsets
  78. ac_ptr  EQU $00
  79. ac_len  EQU $04
  80. ac_per  EQU $06
  81. ac_vol  EQU $08
  82. ac_end  EQU $0C
  83. ac_rest EQU $10
  84. ac_mask EQU $14
  85. ac_rhw  EQU $16
  86.  
  87. T03SZ   EQU 98
  88. T415SZ  EQU 18
  89.  
  90.         SECTION "text",CODE
  91.  
  92. ;**************************************************************************
  93. ;*
  94. ;*      8 CHANNEL PLAY ROUTINE
  95. ;*
  96. ;**************************************************************************
  97.  
  98. ; This code does the magic 8 channel thing (mixing).
  99. MAGIC_8TRK  MACRO
  100.         swap    d6
  101.         swap    d7
  102.         move.b  0(a3,d6.w),d0
  103.         add.b   0(a4,d7.w),d0
  104.         move.b  d0,(a1)+
  105.         swap    d6
  106.         swap    d7
  107.         add.l   d1,d6
  108.         add.l   d2,d7
  109.         ENDM
  110.  
  111. _ChannelO8  lea trackdata8-DB(a6),a1
  112.         cmp.b   #8,d0
  113.         bge.s   xco8
  114.         lsl.b   #2,d0
  115.         adda.w  d0,a1
  116.         movea.l (a1),a1
  117.         clr.w   trk_prevper(a1)
  118.         movea.l trk_audioaddr(a1),a1
  119.         clr.w   ac_per(a1)
  120. xco8        rts
  121.  
  122. _PlayNote8: ;d7(w) = trk #, d1 = note #, d3(w) = instr # a3 = addr of instr
  123.         movea.l mmd_smplarr(a2),a0
  124.         add.w   d3,d3           ;d3 = instr.num << 2
  125.         add.w   d3,d3
  126.         move.l  0(a0,d3.w),d5       ;get address of instrument
  127.     IFNE    CHECK
  128.         beq.s   xco8
  129.     ENDC
  130. inmem8:     add.b   msng_playtransp(a4),d1  ;add play transpose
  131.         add.b   inst_strans(a3),d1  ;and instr. transpose
  132.     IFNE    CHECK
  133.         tst.b   inst_midich(a3)
  134.         bne.s   xco8        ;MIDI
  135.     ENDC
  136.         clr.b   trk_vibroffs(a5)    ;clr vibrato offset
  137.         move.l  d5,a0
  138.         subq.b  #1,d1
  139.     IFNE    CHECK
  140.         tst.w   4(a0)
  141.         bmi.s   xco8        ;Synth
  142.     ENDC
  143. tlwtst08:   tst.b   d1
  144.         bpl.s   notenot2low8
  145.         add.b   #12,d1  ;note was too low, octave up
  146.         bra.s   tlwtst08
  147. notenot2low8:   cmp.b   #62,d1
  148.         ble.s   endpttest8
  149.         sub.b   #12,d1  ;note was too high, octave down
  150. endpttest8:
  151.         moveq   #0,d2
  152.         moveq   #0,d3
  153.         lea _periodtable+32-DB(a6),a1
  154.         move.b  trk_finetune(a5),d2 ;finetune value
  155.         add.b   d2,d2
  156.         add.b   d2,d2       ;multiply by 4...
  157.         ext.w   d2      ;extend
  158.         movea.l 0(a1,d2.w),a1   ;period table address
  159.     IFNE    IFFMOCT
  160.         move.w  4(a0),d0    ;Soitin-struct in a0
  161.         bne.s   gid_notnormal   ;note # in d1 (0 - ...)
  162.     ENDC
  163. gid_cont_ext    move.l  a1,trk_periodtbl(a5)
  164.         add.b   d1,d1
  165.         move.w  0(a1,d1.w),d5 ;put period to d5
  166.         move.l  a0,d0
  167.         addq.l  #6,d0       ;Skip structure
  168.         move.l  (a0),d1     ;length
  169.         add.l   d0,d1       ;sample end pointer
  170.         move.w  inst_repeat(a3),d2
  171.         move.w  inst_replen(a3),d3
  172.     IFNE    IFFMOCT
  173.         bra gid_setrept
  174. gid_addtable    dc.b    0,6,12,18,24,30
  175. gid_divtable    dc.b    31,7,3,15,63,127
  176. gid_notnormal   cmp.w   #7,d0
  177.         blt.s   gid_not_ext
  178.         suba.w  #48,a1
  179.         bra.s   gid_cont_ext
  180. gid_not_ext move.l  d7,-(sp)
  181.         moveq   #0,d7
  182.         move.w  d1,d7
  183.         divu    #12,d7  ;octave #
  184.         move.l  d7,d5
  185.         cmp.w   #6,d7   ;if oct > 5, oct = 5
  186.         blt.s   nohioct
  187.         moveq   #5,d7
  188. nohioct     swap    d5  ;note number in this oct (0-11) is in d5
  189.         move.l  (a0),d1
  190.         cmp.w   #6,d0
  191.         ble.s   nounrecit
  192.         moveq   #6,d0
  193. nounrecit   add.b   gid_addtable-1(pc,d0.w),d7
  194.         move.b  gid_divtable-1(pc,d0.w),d0
  195.         divu    d0,d1   ;get length of the highest octave
  196.         swap    d1
  197.         clr.w   d1
  198.         swap    d1
  199.         move.l  d1,d0       ;d0 and d1 = length of the 1st oct
  200.         move.w  inst_repeat(a3),d2
  201.         move.w  inst_replen(a3),d3
  202.         moveq   #0,d6
  203.         move.b  shiftcnt(pc,d7.w),d6
  204.         lsl.w   d6,d2
  205.         lsl.w   d6,d3
  206.         lsl.w   d6,d1
  207.         move.b  mullencnt(pc,d7.w),d6
  208.         mulu    d6,d0       ;offset of this oct from 1st oct
  209.         add.l   a0,d0       ;add base address to offset
  210.         addq.l  #6,d0       ;skip structure
  211.         add.l   d0,d1
  212.         move.l  a1,trk_periodtbl(a5)
  213.         add.b   octstart(pc,d7.w),d5
  214.         add.b   d5,d5
  215.         move.w  0(a1,d5.w),d5
  216.         move.l  (sp)+,d7
  217.         bra.s   gid_setrept
  218. shiftcnt:   dc.b    4,3,2,1,1,0,2,2,1,1,0,0,1,1,0,0,0,0
  219.         dc.b    3,3,2,2,1,0,5,4,3,2,1,0,6,5,4,3,2,1
  220. mullencnt:  dc.b    15,7,3,1,1,0,3,3,1,1,0,0,1,1,0,0,0,0
  221.         dc.b    7,7,3,3,1,0,31,15,7,3,1,0,63,31,15,7,3,1
  222. octstart:   dc.b    12,12,12,12,24,24,0,12,12,24,24,36,0,12,12,24,36,36
  223.         dc.b    0,12,12,24,24,24,12,12,12,12,12,12,12,12,12,12,12,12
  224.     ENDC
  225. gid_setrept add.l   d2,d2
  226.         add.l   d0,d2       ;rep. start pointer
  227.         cmp.w   #1,d3
  228.         bhi.s   gid_noreplen2
  229.         moveq   #0,d3       ;no repeat
  230.         bra.s   gid_cont
  231. gid_noreplen2   add.l   d3,d3
  232.         add.l   d2,d3       ;rep. end pointer
  233.  
  234. gid_cont    moveq   #0,d4
  235.         move.w  trk_soffset(a5),d4
  236.         add.l   d4,d0
  237.         cmp.l   d0,d1
  238.         bhi.s   pn_nooffsovf8
  239.         sub.l   d4,d0
  240. pn_nooffsovf8   movea.l trk_audioaddr(a5),a1 ;base of this channel's regs
  241.         move.l  d0,(a1)     ;put it in ac_ptr
  242.         moveq   #0,d4
  243.         move.b  trk_previnstr(a5),d4
  244.         lea flags-DB(a6),a0
  245.         btst    #0,0(a0,d4.w)       ;test flags.SSFLG_LOOP
  246.         bhi.s   repeat8
  247.  
  248.         tst.b   trk_split(a5)
  249.         beq.s   pn8_nosplit0
  250.         clr.l   ac_rest(a1)
  251.         subq.l  #1,d1
  252.         move.l  d1,ac_end(a1)
  253.         bra.s   retsn18
  254.  
  255. pn8_nosplit0    sub.l   d0,d1
  256.         lsr.l   #1,d1
  257.         move.w  d1,ac_len(a1)
  258.         move.l  #_chipzero,ac_rest(a1)
  259.         move.w  #1,ac_end(a1)
  260.         bra.s   retsn18
  261.  
  262. repeat8:    tst.b   trk_split(a5)
  263.         bne.s   pn8_split1
  264.         move.l  d3,d1
  265.         sub.l   d0,d1
  266.         lsr.l   #1,d1
  267.         move.w  d1,ac_len(a1)
  268.         move.l  d2,ac_rest(a1)  ;remember rep. start
  269.         sub.l   d2,d3
  270.         lsr.l   #1,d3
  271.         move.w  d3,ac_end(a1)   ;remember rep. length
  272.         bra.s   retsn18
  273.  
  274. pn8_split1  move.l  d2,ac_rest(a1)
  275.         move.l  d3,ac_end(a1)
  276. retsn18:    move.w  d5,ac_per(a1)   ;getinsdata puts period to d5
  277.         move.w  d5,trk_prevper(a5)
  278. retsn28:    rts
  279.  
  280. _IntHandler8:   movem.l d2-d7/a2-a5,-(sp)
  281.         lea DB,a6
  282.         lea trksplit-DB(a6),a2
  283.         move.w  currchsize2-DB(a6),d4
  284. ; ================ 8 channel handling (buffer swap) ======
  285.         move.w  #800,d0
  286.         not.b   whichbuff-DB(a6)    ;swap buffer
  287.         bne.s   usebuff1
  288.         tst.b   (a2)+
  289.         beq.s   tnspl0
  290.         move.l  a1,$a0(a0)
  291.         move.w  d4,$a4(a0)
  292. tnspl0      lea 800(a1),a5
  293.         tst.b   (a2)+
  294.         beq.s   tnspl1
  295.         move.l  a5,$b0(a0)
  296.         move.w  d4,$b4(a0)
  297. tnspl1      adda.w  d0,a5
  298.         tst.b   (a2)+
  299.         beq.s   tnspl2
  300.         move.l  a5,$c0(a0)
  301.         move.w  d4,$c4(a0)
  302. tnspl2      adda.w  d0,a5
  303.         tst.b   (a2)
  304.         beq.s   buffset
  305.         move.l  a5,$d0(a0)
  306.         move.w  d4,$d4(a0)
  307.         bra.s   buffset
  308. usebuff1    lea 400(a1),a1
  309.         tst.b   (a2)+
  310.         beq.s   tnspl0b
  311.         move.l  a1,$a0(a0)
  312.         move.w  d4,$a4(a0)
  313. tnspl0b     lea 800(a1),a5
  314.         tst.b   (a2)+
  315.         beq.s   tnspl1b
  316.         move.l  a5,$b0(a0)
  317.         move.w  d4,$b4(a0)
  318. tnspl1b     adda.w  d0,a5
  319.         tst.b   (a2)+
  320.         beq.s   tnspl2b
  321.         move.l  a5,$c0(a0)
  322.         move.w  d4,$c4(a0)
  323. tnspl2b     tst.b   (a2)
  324.         beq.s   buffset
  325.         adda.w  d0,a5
  326.         move.l  a5,$d0(a0)
  327.         move.w  d4,$d4(a0)
  328. buffset     move.w  #1<<7,$9c(a0)
  329.         lea tmpvol-DB(a6),a2
  330.         move.b  (a2)+,$a9(a0)
  331.         move.b  (a2)+,$b9(a0)
  332.         move.b  (a2)+,$c9(a0)
  333.         move.b  (a2),$d9(a0)
  334.         move.l  #3719168,d3 ;227 * 16384
  335. ; ============== fill buffers ============
  336. startfillb  moveq   #0,d4       ;mask for DMA
  337.         lea track0hw-DB(a6),a2
  338.         tst.b   trksplit-DB(a6)
  339.         bne.s   tspl0c
  340.         bsr.w   pushregs
  341.         bra.s   tnspl0c
  342. tspl0c      bsr.s   fillbuf
  343.         movea.l a5,a1
  344. tnspl0c     lea track1hw-DB(a6),a2
  345.         tst.b   trksplit+1-DB(a6)
  346.         bne.s   tspl1c
  347.         bsr.w   pushregs
  348.         bra.s   tnspl1c
  349. tspl1c      bsr.s   fillbuf
  350.         movea.l a5,a1
  351. tnspl1c     lea track2hw-DB(a6),a2
  352.         tst.b   trksplit+2-DB(a6)
  353.         bne.s   tspl2c
  354.         bsr.w   pushregs
  355.         bra.s   tnspl2c
  356. tspl2c      bsr.s   fillbuf
  357.         movea.l a5,a1
  358. tnspl2c     lea track3hw-DB(a6),a2
  359.         tst.b   trksplit+3-DB(a6)
  360.         bne.s   tspl3c
  361.         bsr.w   pushregs
  362.         bra.w   do_play8
  363. tspl3c      bsr.s   fillbuf
  364.         bra.w   do_play8
  365. ; =========================================================
  366. ;calculate channel A period
  367. fillbuf:    move.l  d3,d7
  368.         move.w  ac_per(a2),d6
  369.         beq.s   setpzero0
  370.         move.l  d7,d2
  371.         divu    d6,d2
  372.         moveq   #0,d1
  373.         move.w  d2,d1
  374.         add.l   d1,d1
  375.         add.l   d1,d1
  376. ;get channel A addresses
  377.         move.l  ac_end(a2),a5
  378.         move.l  (a2),d0
  379.         beq.s   setpzero0
  380. chA_dfnd    move.l  d0,a3   ;a3 = start address, a5 = end address
  381. ;calc bytes before end
  382.         mulu    currchsize-DB(a6),d2
  383.         clr.w   d2
  384.         swap    d2
  385. ; d2 = # of bytes/fill
  386.         add.l   a3,d2   ;d2 = end position after this fill
  387.         sub.l   a5,d2   ;subtract sample end
  388.         bmi.s   norestart0
  389.         move.l  ac_rest(a2),d0
  390.         beq.s   rst0end
  391.         move.l  d0,(a2)
  392.         move.l  d0,a3
  393.         bra.s   norestart0
  394. rst0end     clr.l   (a2)
  395. setpzero0   lea zerodata-DB(a6),a3
  396.         moveq   #0,d1
  397. norestart0
  398. ;channel B period
  399.         move.w  SIZE4TRKHW+ac_per(a2),d6
  400.         beq.s   setpzero0b
  401.         divu    d6,d7
  402.         moveq   #0,d2
  403.         move.w  d7,d2
  404.         add.l   d2,d2
  405.         add.l   d2,d2
  406. ;channel B addresses
  407.         move.l  SIZE4TRKHW+ac_end(a2),a5
  408.         move.l  SIZE4TRKHW(a2),d0
  409.         beq.s   setpzero0b
  410.         move.l  d0,a4
  411.         mulu    currchsize-DB(a6),d7
  412.         clr.w   d7
  413.         swap    d7
  414.         add.l   a4,d7
  415.         sub.l   a5,d7
  416.         bmi.s   norestart0b
  417.         move.l  SIZE4TRKHW+ac_rest(a2),d0
  418.         beq.s   rst0endb
  419.         move.l  d0,SIZE4TRKHW(a2)
  420.         move.l  d0,a4
  421.         bra.s   norestart0b
  422. rst0endb    clr.l   SIZE4TRKHW(a2)
  423. setpzero0b  lea zerodata-DB(a6),a4
  424.         moveq   #0,d2
  425. norestart0b moveq   #0,d6
  426.         moveq   #0,d7
  427.         move.w  currchszcnt-DB(a6),d5
  428.         lea 800(a1),a5  ;get addr. of next buffer
  429. do8trkmagic
  430.         MAGIC_8TRK  ;20 times..
  431.         MAGIC_8TRK
  432.         MAGIC_8TRK
  433.         MAGIC_8TRK
  434.         MAGIC_8TRK
  435.         MAGIC_8TRK
  436.         MAGIC_8TRK
  437.         MAGIC_8TRK
  438.         MAGIC_8TRK
  439.         MAGIC_8TRK
  440.         MAGIC_8TRK
  441.         MAGIC_8TRK
  442.         MAGIC_8TRK
  443.         MAGIC_8TRK
  444.         MAGIC_8TRK
  445.         MAGIC_8TRK
  446.         MAGIC_8TRK
  447.         MAGIC_8TRK
  448.         MAGIC_8TRK
  449.         MAGIC_8TRK
  450.  
  451.         dbf d5,do8trkmagic  ;do until cnt zero
  452. end8trkmagic    clr.w   d6
  453.         clr.w   d7
  454.         swap    d6
  455.         swap    d7
  456.         add.l   d6,(a2)
  457.         add.l   d7,SIZE4TRKHW(a2)
  458.         rts
  459.  
  460. _Wait1line: move.l  d0,-(sp)
  461.         moveq   #$79,d0
  462. wl0:        move.b  $dff007,d1
  463. wl1:        cmp.b   $dff007,d1
  464.         beq.s   wl1
  465.         dbf d0,wl0
  466.         move.l  (sp)+,d0
  467.         rts
  468. ; ========== this channel is not splitted
  469. pushregs    move.l  ac_rhw(a2),a3       ;address of real hardware
  470.         tst.w   ac_per(a2)
  471.         beq.s   pregs_stop
  472.         move.w  ac_per(a2),ac_per(a3)   ;push new period
  473.         move.l  (a2),d0 ;ac_ptr
  474.         beq.s   pregs_nonewp
  475.         move.w  ac_mask(a2),d1
  476.         move.w  d1,$96(a0)  ;stop DMA of curr. channel
  477.         or.w    d1,d4
  478.         clr.l   (a2)+
  479.         move.l  d0,(a3)+    ;to real ac_ptr
  480.         move.w  (a2),(a3)   ;push ac_len
  481. pregs_nonewp    lea 400(a1),a1  ;next buffer
  482.         rts
  483. pregs_stop  move.w  ac_mask(a2),d1
  484.         move.w  d1,$96(a0)
  485.         bra.s   pregs_nonewp
  486. ; ========== should we start DMA of non-splitted channels?
  487. do_play8    tst.w   d4
  488.         beq.s   do_play8_b  ;no.
  489.         bsr.s   _Wait1line
  490.         bset    #15,d4
  491.         move.w  d4,$96(a0)
  492.         bsr.s   _Wait1line
  493.         lsr.b   #1,d4
  494.         bcc.s   plr_nos8dma0
  495.         move.l  track0hw+ac_rest-DB(a6),$a0(a0)
  496.         move.w  track0hw+ac_end-DB(a6),$a4(a0)
  497. plr_nos8dma0    lsr.b   #1,d4
  498.         bcc.s   plr_nos8dma1
  499.         move.l  track1hw+ac_rest-DB(a6),$b0(a0)
  500.         move.w  track1hw+ac_end-DB(a6),$b4(a0)
  501. plr_nos8dma1    lsr.b   #1,d4
  502.         bcc.s   plr_nos8dma2
  503.         move.l  track2hw+ac_rest-DB(a6),$c0(a0)
  504.         move.w  track2hw+ac_end-DB(a6),$c4(a0)
  505. plr_nos8dma2    lsr.b   #1,d4
  506.         bcc.s   do_play8_b
  507.         move.l  track3hw+ac_rest-DB(a6),$d0(a0)
  508.         move.w  track3hw+ac_end-DB(a6),$d4(a0)
  509. ; ========== player starts here...
  510. do_play8_b  movea.l _module8-DB(a6),a2
  511.         move.l  a2,d0
  512.         beq.w   plr_exit8
  513.         move.l  mmd_songinfo(a2),a4
  514.         moveq   #0,d3
  515.         lea mmd_counter(a2),a0
  516.         move.b  (a0),d3
  517.         addq.b  #1,d3
  518.         cmp.b   msng_tempo2(a4),d3
  519.         bge.s   plr_pnewnote8   ;play new note
  520.         move.b  d3,(a0)
  521.         bra.w   nonewnote8  ;do just fx
  522. ; --- new note!! first get address of current block
  523. plr_pnewnote8:  clr.b   (a0)
  524.         tst.w   blkdelay-DB(a6)
  525.         beq.s   plr_noblkdelay8
  526.         subq.w  #1,blkdelay-DB(a6)
  527.         bne.w   nonewnote8
  528. plr_noblkdelay8 move.w  mmd_pblock(a2),d0
  529.         movea.l mmd_blockarr(a2),a0
  530.         add.w   d0,d0
  531.         add.w   d0,d0
  532.         movea.l 0(a0,d0.w),a1   ;block...
  533.         move.w  mmd_pline(a2),d0
  534.     IFNE    PLAYMMD0
  535.         cmp.b   #'1',3(a2)  ;check ID type
  536.         bge.s   plr_mmd1_0
  537.         move.w  d0,d1
  538.         add.w   d0,d0
  539.         add.w   d1,d0       ;d0 = d0 * 3
  540.         clr.l   numtracks-DB(a6)
  541.         move.b  (a1)+,numtracks+1-DB(a6)
  542.         move.b  (a1),numlines+1-DB(a6)
  543.         mulu    numtracks-DB(a6),d0
  544.         pea 1(a1,d0.w)
  545.         bra.s   plr_begloop
  546. plr_mmd1_0
  547.     ENDC
  548.         add.w   d0,d0
  549.         add.w   d0,d0       ;d0 = d0 * 4
  550.         mulu    (a1),d0     ;numtracks * d0
  551.         pea 8(a1,d0.l)  ;address of the current note
  552.         move.w  (a1)+,numtracks-DB(a6)
  553.         move.w  (a1),numlines-DB(a6)
  554. plr_begloop moveq   #0,d7       ;number of track
  555.         moveq   #0,d4
  556.         pea trackdata8-DB(a6)
  557. plr_loop08  moveq   #0,d5
  558.         cmp.w   #8,d7
  559.         bge.w   plr_endloop08
  560.         move.l  (sp),a1
  561.         movea.l (a1)+,a5    ;get address of this track's struct
  562.         move.l  a1,(sp)
  563. ; ---------------- get the note numbers
  564.         moveq   #0,d3
  565.         move.l  4(sp),a1
  566.     IFNE    PLAYMMD0
  567.         cmp.b   #'1',3(a2)
  568.         bge.s   plr_mmd1_1
  569.         move.b  (a1)+,d5
  570.         move.b  (a1)+,d6
  571.         move.b  (a1)+,trk_cmdqual(a5)
  572.         move.b  d6,d3
  573.         and.w   #$0F,d6
  574.         lsr.b   #4,d3
  575.         bclr    #7,d5
  576.         beq.s   plr_bseti4
  577.         bset    #4,d3
  578. plr_bseti4  bclr    #6,d5
  579.         beq.s   plr_bseti5
  580.         bset    #5,d3
  581. plr_bseti5  bra.s   plr_nngok
  582. plr_mmd1_1
  583.     ENDC
  584.         move.b  (a1)+,d5    ;get the number of this note
  585.         bpl.s   plr_nothinote
  586.         moveq   #0,d5
  587. plr_nothinote   move.b  (a1)+,d3    ;instrument number
  588.         move.b  (a1)+,d6    ;cmd number
  589.         and.w   #$1F,d6     ;recognize only cmds 00 - 1F
  590.         move.b  (a1)+,trk_cmdqual(a5)   ;databyte (qualifier)
  591. plr_nngok   move.l  a1,4(sp)
  592. ; ---------------- check if there's an instrument number
  593.         and.w   #$3F,d3
  594.         beq.s   noinstnum8
  595. ; ---------------- finally, save the number
  596.         subq.b  #1,d3
  597.         move.b  d3,trk_previnstr(a5) ;remember instr. number!
  598.     IFNE    HOLD
  599.         lea holdvals-DB(a6),a0
  600.         adda.w  d3,a0
  601.         move.b  (a0),trk_inithold(a5)
  602.         move.b  63(a0),trk_finetune(a5)
  603.     ENDC
  604.         asl.w   #3,d3
  605.         lea 0(a4,d3.w),a3   ;a3 contains now address of it
  606.         move.l  a3,trk_previnstra(a5)
  607.         moveq   #0,d0
  608. ; ---------------- set volume to 64
  609.         movea.l trk_audioaddr(a5),a0
  610.         movea.l ac_vol(a0),a0   ;ptr to volume hardware register
  611.         moveq   #64,d0
  612.         move.b  d0,(a0)
  613.         move.b  d0,trk_prevvol(a5)
  614. ; ---------------- remember transpose
  615.         move.b  inst_strans(a3),trk_stransp(a5)
  616.         clr.w   trk_soffset(a5)     ;sample offset
  617. ; ---------------- check the commands
  618. noinstnum8  move.b  d6,trk_cmd(a5)  ;save the effect number
  619.         beq.w   fx8 ;no effect
  620.         move.b  trk_cmdqual(a5),d4  ;get qualifier...
  621.         add.b   d6,d6   ;* 2
  622.         move.w  f_table8(pc,d6.w),d0
  623.         jmp fst8(pc,d0.w)
  624. f_table8    dc.w    fx8-fst8,fx8-fst8,fx8-fst8,f_038-fst8,fx8-fst8,fx8-fst8,fx8-fst8,fx8-fst8
  625.         dc.w    f_088-fst8,f_098-fst8,fx8-fst8,f_0b8-fst8,f_0c8-fst8,fx8-fst8,fx8-fst8,f_0f8-fst8
  626.         dc.w    fx8-fst8,fx8-fst8,fx8-fst8,fx8-fst8,fx8-fst8,f_158-fst8,f_168-fst8,fx8-fst8
  627.         dc.w    fx8-fst8,f_198-fst8,fx8-fst8,fx8-fst8,fx8-fst8,f_1d8-fst8,fx8-fst8,f_1f8-fst8
  628. fst8
  629. ; ---------------- tempo (F)
  630. f_0f8       tst.b   d4      ;test effect qual..
  631.         beq.s   fx0fchgblck8    ;if effect qualifier (last 2 #'s)..
  632.         cmp.b   #$f0,d4     ;..is zero, go to next block
  633.         bhi.s   fx0fspecial8
  634.         moveq   #0,d0
  635.         move.b  d4,d0
  636.         bsr.w   _SetTempo
  637.         bra.w   fx8
  638. ; ---------------- no, it was FFx
  639. fx0fspecial8    cmp.b   #$f2,d4
  640.         beq.s   f_1f8
  641.         cmp.b   #$f4,d4
  642.         beq.s   f_1f8
  643.         cmp.b   #$f5,d4
  644.         bne.s   isfxfe8
  645. ; ---------------- it was FF2, nothing to do now
  646. f_1f8       move.b  d5,(a5) ; save the note number
  647.         moveq   #0,d5   ; clear the number for awhile
  648.     IFNE    HOLD
  649.         move.b  trk_inithold(a5),trk_noteoffcnt(a5) ;initialize hold
  650.         bne.w   plr_endloop08   
  651.         st  trk_noteoffcnt(a5)
  652.     ENDC
  653.         bra.w   plr_endloop08
  654. isfxfe8     cmp.b   #$fe,d4
  655.         bne.s   notcmdfe8
  656. ; ---------------- it was FFE, stop playing
  657.         clr.w   mmd_pstate(a2)
  658.         bsr.w   _End8Play
  659.         bra.w   fx8
  660. ; ---------------- F00
  661. fx0fchgblck8    move.b  #1,nextblock-DB(a6)
  662.         bra.w   fx8
  663. notcmdfe8   cmp.b   #$fd,d4 ;change period
  664.         bne.s   isfxff8
  665. ; ---------------- FFD, change the period, don't replay the note
  666.         cmp.w   #8,d7
  667.         bge.w   fx8
  668.         movea.l trk_periodtbl(a5),a0    ;period table
  669.         subq.b  #1,d5
  670.         bmi.w   plr_endloop08   ;under zero, do nothing
  671.         add.b   msng_playtransp(a4),d5
  672.         add.b   trk_stransp(a5),d5
  673.         add.b   d5,d5
  674.         move.w  0(a0,d5.w),trk_prevper(a5) ;get & push the period
  675.         moveq   #0,d5       ;don't retrigger note
  676.         bra.w   fx8 ;done!!
  677. isfxff8     cmp.b   #$ff,d4     ;note off??
  678.         bne.w   fx8
  679.         move.w  d7,d0
  680.         bsr.w   _ChannelO8
  681.         bra.w   fx8
  682. ; ---------------- change volume
  683. f_0c8       btst    #4,msng_flags(a4)   ;look at flags
  684.         bne.s   volhex8
  685.         move.b  d4,d1       ;get again
  686.         lsr.b   #4,d4       ;get number from left
  687.         mulu    #10,d4      ;number of tens
  688.         and.b   #$0f,d1     ;this time don't get tens
  689.         add.b   d1,d4       ;add them
  690. volhex8     cmp.b   #64,d4
  691.         bhi.s   go_nocmd8
  692.         movea.l trk_audioaddr(a5),a0
  693.         movea.l ac_vol(a0),a0
  694.         move.b  d4,(a0)
  695. go_nocmd8   bra.w   fx8
  696. ; ---------------- tempo2 change??
  697. f_098
  698.     IFNE    CHECK
  699.         and.b   #$1F,d4
  700.         bne.s   fx9chk8
  701.         moveq   #$20,d4
  702.     ENDC
  703. fx9chk8     move.b  d4,msng_tempo2(a4)
  704.         bra fx8
  705. ; ---------------- finetune
  706. f_158
  707.     IFNE    CHECK
  708.         cmp.b   #7,d4
  709.         bgt fx8
  710.         cmp.b   #-8,d4
  711.         blt fx8
  712.     ENDC
  713.         move.b  d4,trk_finetune(a5)
  714.         bra fx8
  715. ; ---------------- repeat loop
  716. f_168       tst.b   d4
  717.         bne.s   plr_dorpt8
  718.         move.w  mmd_pline(a2),rptline-DB(a6)
  719.         bra fx8
  720. plr_dorpt8  tst.w   rptcounter-DB(a6)
  721.         beq.s   plr_newrpt8
  722.         subq.w  #1,rptcounter-DB(a6)
  723.         beq fx8
  724.         bra.s   plr_setrptline8
  725. plr_newrpt8 move.b  d4,rptcounter+1-DB(a6)
  726. plr_setrptline8 move.w  rptline-DB(a6),d0
  727.         addq.w  #1,d0
  728.         move.w  d0,nextblockline-DB(a6)
  729.         bra.s   fx8
  730. ; ---------------- note off time set??
  731. f_088
  732.     IFNE    HOLD
  733.         move.b  d4,d0
  734.         and.b   #$0f,d4
  735.         move.b  d4,trk_inithold(a5) ;right = hold
  736.     ENDC
  737.         bra.s   fx8
  738. ; ---------------- sample begin offset
  739. f_198       tst.b   d4
  740.         beq.s   fx8
  741.         lsl.w   #8,d4
  742.         move.w  d4,trk_soffset(a5)
  743.         bra.s   fx8
  744. ; ---------------- cmd Bxx, "position jump"
  745. f_0b8   
  746.     IFNE    CHECK
  747.         cmp.b   #'2',3(a2)
  748.         beq.s   chk0b_mmd2
  749.         cmp.w   msng_songlen(a4),d4
  750.         bhi.s   fx8
  751.         bra.s   chk0b_end
  752. chk0b_mmd2  move.w  mmd_pseq(a2),d0     ;get seq number
  753.         movea.l msng_pseqs(a4),a1   ;ptr to playseqs
  754.         movea.l 0(a1,d0.w),a0       ;a0 = ptr to curr PlaySeq
  755.         cmp.w   40(a0),d4       ;test song length
  756.         bhi.s   fx8
  757. chk0b_end
  758.     ENDC
  759.         move.w  d4,mmd_pseqnum(a2)
  760.         st  nextblock-DB(a6)
  761.         bra.s   fx8
  762. ; ---------------- cmd 1Dxx, jump to next seq, line # specified
  763. f_1d8       move.w  #$1ff,nextblock-DB(a6)
  764.         addq.w  #1,d4
  765.         move.w  d4,nextblockline-DB(a6)
  766.         bra.s   fx8
  767. ; ---------------- try portamento (3)
  768. f_038       subq.b  #1,d5
  769.         bmi.s   plr_setfx3spd8
  770. plr_fx3note8    movea.l trk_periodtbl(a5),a0
  771.         add.b   msng_playtransp(a4),d5  ;play transpose
  772.         add.b   trk_stransp(a5),d5 ;and instrument transpose
  773.         bmi.s   plr_endloop08   ;again.. too low
  774.         add.w   d5,d5
  775.         move.w  0(a0,d5.w),trk_porttrgper(a5) ;period of this note is the target
  776. plr_setfx3spd8  tst.b   d4      ;qual?
  777.         beq.s   plr_endloop08   ;0 -> do nothing
  778.         move.b  d4,trk_prevportspd(a5)  ;remember size
  779.         bra.s   plr_endloop08
  780. ; ---------------- everything is checked now: play or not to play??
  781. fx8     tst.b   d5  ;Now we'll check if we have to play a note
  782.         beq.s   plr_endloop08   ;no.
  783. ; ---------------- we decided to play
  784.         move.b  d5,(a5)
  785.         move.w  d5,d1
  786.         moveq   #0,d3
  787.         move.b  trk_previnstr(a5),d3    ;instr #
  788.         movea.l trk_previnstra(a5),a3   ;instr data address
  789.     IFNE    HOLD
  790.         move.b  trk_inithold(a5),trk_noteoffcnt(a5)
  791.         bne.s   plr_nohold8
  792.         st  trk_noteoffcnt(a5)
  793.     ENDC
  794. ; ---------------- and finally:
  795. plr_nohold8 bsr _PlayNote8
  796. ; ---------------- end of loop: handle next track, or quit
  797. plr_endloop08   addq.b  #1,d7
  798.         cmp.w   numtracks-DB(a6),d7
  799.         blt.w   plr_loop08
  800.         addq.l  #8,sp       ;trackdataptrs
  801.         lea trackdata8-DB(a6),a5
  802. ; and advance song pointers
  803.         lea nextblock-DB(a6),a3
  804.         move.w  nextblockline-DB(a6),d1
  805.         beq.s   plr_advlinenum
  806.         clr.w   nextblockline-DB(a6)
  807.         subq.w  #1,d1
  808.         bra.s   plr_linenumset
  809. plr_advlinenum  move.w  mmd_pline(a2),d1    ;get current line #
  810.         addq.w  #1,d1           ;advance line number
  811. plr_linenumset  cmp.w   numlines-DB(a6),d1  ;advance block?
  812.         bhi.s   plr_chgblock        ;yes.
  813.         tst.b   (a3)            ;command F00/1Dxx?
  814.         beq plr_nochgblock      ;no, don't change block
  815. ; -------- CHANGE BLOCK? -------------------------------------------------
  816. plr_chgblock    tst.b   nxtnoclrln-DB(a6)
  817.         bne.s   plr_noclrln
  818.         moveq   #0,d1           ;clear line number
  819. plr_noclrln tst.w   mmd_pstate(a2)      ;play block or play song
  820.         bpl plr_nonewseq        ;play block only...
  821.         cmp.b   #'2',3(a2)      ;MMD2?
  822.         bne.s   plr_noMMD2_0
  823. ; ********* BELOW CODE FOR MMD2 ONLY ************************************
  824. ; -------- CHANGE SEQUENCE -----------------------------------------------
  825. plr_skipseq move.w  mmd_pseq(a2),d0     ;actually stored as << 2
  826.         movea.l msng_pseqs(a4),a1
  827.         movea.l 0(a1,d0.w),a0
  828.         move.w  mmd_pseqnum(a2),d0  ;get play sequence number
  829.         tst.b   (a3)
  830.         bmi.s   plr_noadvseq        ;Bxx sets nextblock to -1
  831.         addq.w  #1,d0           ;advance sequence number
  832. plr_noadvseq    cmp.w   40(a0),d0       ;is this the highest seq number??
  833.         blt.s   plr_notagain        ;no.
  834. ; -------- CHANGE SECTION ------------------------------------------------
  835.         move.w  mmd_psecnum(a2),d0  ;get section number
  836.         addq.w  #1,d0           ;increase..
  837.         cmp.w   msng_songlen(a4),d0 ;highest section?
  838.         blt.s   plr_nohisec
  839.         moveq   #0,d0           ;yes.
  840. plr_nohisec move.w  d0,mmd_psecnum(a2)  ;push back.
  841.         add.w   d0,d0
  842.         movea.l msng_sections(a4),a0    ;section table
  843.         move.w  0(a0,d0.w),d0       ;new playseqlist number
  844.         add.w   d0,d0
  845.         add.w   d0,d0
  846.         move.w  d0,mmd_pseq(a2)
  847.         movea.l 0(a1,d0.w),a0       ;a0 = ptr to new PlaySeq
  848.         moveq   #0,d0           ;playseq OFFSET = 0
  849. ; -------- FETCH BLOCK NUMBER FROM SEQUENCE ------------------------------
  850. plr_notagain    move.w  d0,mmd_pseqnum(a2)  ;remember new playseq pos
  851.         add.w   d0,d0
  852.         move.w  42(a0,d0.w),d0      ;get number of the block
  853.         bpl.s   plr_changeblk   ;neg. values for future expansion
  854.         bra.s   plr_skipseq ;(skip them)
  855. ; ********* BELOW CODE FOR MMD0/MMD1 ONLY *******************************
  856. plr_noMMD2_0    move.w  mmd_pseqnum(a2),d0  ;get play sequence number
  857.         tst.b   (a3)
  858.         bmi.s   plr_noadvseq_b      ;Bxx sets nextblock to -1
  859.         addq.w  #1,d0           ;advance sequence number
  860. plr_noadvseq_b  cmp.w   msng_songlen(a4),d0 ;is this the highest seq number??
  861.         blt.s   plr_notagain_b      ;no.
  862.         moveq   #0,d0           ;yes: restart song
  863. plr_notagain_b  move.b  d0,mmd_pseqnum+1(a2)    ;remember new playseq-#
  864.         lea msng_playseq(a4),a0 ;offset of sequence table
  865.         move.b  0(a0,d0.w),d0       ;get number of the block
  866. ; ********* BELOW CODE FOR BOTH FORMATS *********************************
  867. plr_changeblk
  868.     IFNE    CHECK
  869.         cmp.w   msng_numblocks(a4),d0   ;beyond last block??
  870.         blt.s   plr_nolstblk        ;no..
  871.         moveq   #0,d0           ;play block 0
  872.     ENDC
  873. plr_nolstblk    move.w  d0,mmd_pblock(a2)   ;store block number
  874. plr_nonewseq    clr.w   (a3)            ;clear this if F00 set it
  875. plr_nochgblock  move.w  d1,mmd_pline(a2)    ;set new line number
  876.  
  877.     IFNE    HOLD
  878.         lea trackdata8-DB(a6),a5
  879.         movea.l mmd_blockarr(a2),a0
  880.         move.w  mmd_pblock(a2),d0
  881.         add.w   d0,d0
  882.         add.w   d0,d0
  883.         movea.l 0(a0,d0.w),a1   ;block...
  884.         move.w  mmd_pline(a2),d0
  885.         move.b  msng_tempo2(a4),d3  ;interrupts/note
  886.     IFNE    PLAYMMD0
  887.         cmp.b   #'1',3(a2)
  888.         bge.s   plr_mmd1_2
  889.         move.b  (a1),d7         ;# of tracks
  890.         move.w  d0,d1
  891.         add.w   d0,d0   ;d0 * 2
  892.         add.w   d1,d0   ;+ d0 = d0 * 3
  893.         mulu    d7,d0
  894.         lea 2(a1,d0.w),a3
  895.         subq.b  #1,d7
  896. plr_chkholdb    movea.l (a5)+,a1        ;track data
  897.         tst.b   trk_noteoffcnt(a1)  ;hold??
  898.         bmi.s   plr_holdendb        ;no.
  899.         move.b  (a3),d1         ;get the 1st byte..
  900.         bne.s   plr_hold1b
  901.         move.b  1(a3),d1
  902.         and.b   #$f0,d1
  903.         beq.s   plr_holdendb        ;don't hold
  904.         bra.s   plr_hold2b
  905. plr_hold1b  and.b   #$3f,d1         ;note??
  906.         beq.s   plr_hold2b      ;no, cont hold..
  907.         move.b  1(a3),d1
  908.         and.b   #$0f,d1         ;get cmd
  909.         subq.b  #3,d1           ;is there command 3 (slide)
  910.         bne.s   plr_holdendb        ;no -> end holding
  911. plr_hold2b  add.b   d3,trk_noteoffcnt(a1)   ;continue holding...
  912. plr_holdendb    addq.l  #3,a3       ;next note
  913.         dbf d7,plr_chkholdb
  914.         bra.s   nonewnote8
  915. plr_mmd1_2
  916.     ENDC
  917.         move.w  (a1),d7     ;# of tracks
  918.         add.w   d0,d0
  919.         add.w   d0,d0   ;d0 = d0 * 4
  920.         mulu    d7,d0
  921.         lea 8(a1,d0.l),a3
  922.         subq.b  #1,d7
  923. plr_chkhold movea.l (a5)+,a1        ;track data
  924.         tst.b   trk_noteoffcnt(a1)  ;hold??
  925.         bmi.s   plr_holdend     ;no.
  926.         move.b  (a3),d1         ;get the 1st byte..
  927.         bne.s   plr_hold1
  928.         move.b  1(a3),d0
  929.         and.b   #$3F,d0
  930.         beq.s   plr_holdend     ;don't hold
  931.         bra.s   plr_hold2
  932. plr_hold1   and.b   #$7f,d1         ;note??
  933.         beq.s   plr_hold2       ;no, cont hold..
  934.         move.b  2(a3),d1
  935.         subq.b  #3,d1           ;is there command 3 (slide)
  936.         bne.s   plr_holdend     ;no -> end holding
  937. plr_hold2   add.b   d3,trk_noteoffcnt(a1)   ;continue holding...
  938. plr_holdend addq.l  #4,a3       ;next note
  939.         dbf d7,plr_chkhold
  940.     ENDC    
  941. nonewnote8  moveq   #0,d3
  942.         move.b  mmd_counter(a2),d3
  943. plr_fxtime  lea trackdata8-DB(a6),a3
  944.         moveq   #0,d7   ;clear track count
  945. plr_loop1:  movea.l (a3)+,a5
  946.         cmp.w   #8,d7
  947.         bge.w   endl
  948.         moveq   #0,d4
  949.         moveq   #0,d5
  950.         moveq   #0,d6
  951.         move.b  trk_cmd(a5),d6  ;get the fx number
  952.         move.b  trk_cmdqual(a5),d4  ;and the last 2 #'s
  953.     IFNE    HOLD
  954.         tst.b   trk_noteoffcnt(a5)
  955.         bmi.s   plr_nofade
  956.         subq.b  #1,trk_noteoffcnt(a5)
  957.         bpl.s   plr_nofade
  958.         move.w  d7,d0
  959.         bsr.w   _ChannelO8
  960. plr_nofade
  961.     ENDC
  962.         add.b   d6,d6   ;* 2
  963.         move.w  fx_table(pc,d6.w),d0
  964.         jmp fxs(pc,d0.w)
  965. fx_table    dc.w    fx_00-fxs,fx_01-fxs,fx_02-fxs,fx_03-fxs,fx_04-fxs
  966.         dc.w    fx_05-fxs,fx_06-fxs,fx_07-fxs,fx_xx-fxs,fx_xx-fxs
  967.         dc.w    fx_0a-fxs,fx_xx-fxs,endl-fxs,fx_0d-fxs,fx_xx-fxs
  968.         dc.w    fx_0f-fxs
  969.         dc.w    fx_xx-fxs,fx_11-fxs,fx_12-fxs,fx_13-fxs,fx_14-fxs
  970.         dc.w    fx_xx-fxs,fx_xx-fxs,fx_xx-fxs,fx_18-fxs,fx_xx-fxs
  971.         dc.w    fx_1a-fxs,fx_1b-fxs,fx_xx-fxs,fx_xx-fxs,fx_1e-fxs
  972.         dc.w    fx_1f-fxs
  973. fxs:
  974. ;   **************************************** Effect 01 ******
  975. fx_01:      tst.b   d3
  976.         bne.s   fx_01nocnt0
  977.         btst    #5,msng_flags(a4)   ;FLAG_STSLIDE??
  978.         bne endl
  979. fx_01nocnt0 sub.w   d4,trk_prevper(a5)
  980.         move.w  trk_prevper(a5),d5
  981.         cmp.w   #113,d5
  982.         bge plr_newper
  983.         move.w  #113,d5
  984.         move.w  d5,trk_prevper(a5)
  985.         bra plr_newper
  986. ;   **************************************** Effect 11 ******
  987. fx_11       tst.b   d3
  988.         bne fx_xx
  989.         sub.w   d4,trk_prevper(a5)
  990.         move.w  trk_prevper(a5),d5
  991.         bra plr_newper
  992. ;   **************************************** Effect 02 ******
  993. fx_02:      tst.b   d3
  994.         bne.s   fx_02nocnt0
  995.         btst    #5,msng_flags(a4)
  996.         bne endl
  997. fx_02nocnt0 add.w   d4,trk_prevper(a5)
  998.         move.w  trk_prevper(a5),d5
  999.         bra.w   plr_newper
  1000. ;   **************************************** Effect 12 ******
  1001. fx_12       tst.b   d3
  1002.         bne fx_xx
  1003.         add.w   d4,trk_prevper(a5)
  1004.         move.w  trk_prevper(a5),d5
  1005.         bra plr_newper
  1006. ;   **************************************** Effect 00 ******
  1007. fx_00:      tst.b   d4  ;both fxqualifiers are 0s: no arpeggio
  1008.         beq.w   fx_xx
  1009.         move.l  d3,d0
  1010.         divu    #3,d0
  1011.         swap    d0
  1012.         tst.w   d0
  1013.         bne.s   fx_arp12
  1014.         and.b   #$0f,d4
  1015.         add.b   (a5),d4
  1016.         bra.s   fx_doarp
  1017. fx_arp12:   subq.b  #1,d0
  1018.         bne.s   fx_arp2
  1019.         lsr.b   #4,d4
  1020.         add.b   (a5),d4
  1021.         bra.s   fx_doarp
  1022. fx_arp2:    move.b  (a5),d4
  1023. fx_doarp:   subq.b  #1,d4       ;-1 to make it 0 - 127
  1024.         add.b   msng_playtransp(a4),d4  ;add play transpose
  1025.         add.b   trk_stransp(a5),d4  ;add instrument transpose
  1026.         add.b   d4,d4
  1027.         movea.l trk_periodtbl(a5),a1
  1028.         move.w  0(a1,d4.w),d5
  1029.         bra.w   plr_newper
  1030. ;   **************************************** Effect 04 ******
  1031. fx_14       move.b  #6,trk_vibshift(a5)
  1032.         bra.s   vib_cont
  1033. fx_04       move.b  #5,trk_vibshift(a5)
  1034. vib_cont    tst.b   d3
  1035.         bne.s   nonvib
  1036.         move.b  d4,d1
  1037.         beq.s   nonvib
  1038.         and.w   #$0f,d1
  1039.         beq.s   plr_chgvibspd
  1040.         move.w  d1,trk_vibrsz(a5)
  1041. plr_chgvibspd:  and.b   #$f0,d4
  1042.         beq.s   nonvib
  1043.         lsr.b   #3,d4
  1044.         and.b   #$3e,d4
  1045.         move.b  d4,trk_vibrspd(a5)
  1046. nonvib:     move.b  trk_vibroffs(a5),d0
  1047.         lsr.b   #2,d0
  1048.         and.w   #$1f,d0
  1049.         moveq   #0,d1
  1050.         move.b  sinetable(pc,d0.w),d5
  1051.         ext.w   d5
  1052.         muls    trk_vibrsz(a5),d5
  1053.         move.b  trk_vibshift(a5),d1
  1054.         asr.w   d1,d5
  1055.         add.w   trk_prevper(a5),d5
  1056.         move.b  trk_vibrspd(a5),d0
  1057.         add.b   d0,trk_vibroffs(a5)
  1058.         bra.w   plr_newper
  1059. sinetable:  dc.b    0,25,49,71,90,106,117,125,127,125,117,106,90,71,49
  1060.         dc.b    25,0,-25,-49,-71,-90,-106,-117,-125,-127,-125,-117
  1061.         dc.b    -106,-90,-71,-49,-25,0
  1062. ;   **************************************** Effect 06 ******
  1063. fx_06:      tst.b   d3
  1064.         bne.s   fx_06nocnt0
  1065.         btst    #5,msng_flags(a4)
  1066.         bne newvals
  1067. fx_06nocnt0 bsr.s   plr_volslide        ;Volume slide
  1068.         bra.s   nonvib          ;+ Vibrato
  1069. ;   **************************************** Effect 07 ******
  1070. fx_07       tst.b   d3
  1071.         bne.s   nontre
  1072.         move.b  d4,d1
  1073.         beq.s   nontre
  1074.         and.w   #$0f,d1
  1075.         beq.s   plr_chgtrespd
  1076.         move.w  d1,trk_tremsz(a5)
  1077. plr_chgtrespd   and.b   #$f0,d4
  1078.         beq.s   nonvib
  1079.         lsr.b   #2,d4
  1080.         and.b   #$3e,d4
  1081.         move.b  d4,trk_tremspd(a5)
  1082. nontre      move.b  trk_tremoffs(a5),d0
  1083.         lsr.b   #3,d0
  1084.         and.w   #$1f,d0
  1085.         moveq   #0,d1
  1086.         move.b  sinetable(pc,d0.w),d5
  1087.         ext.w   d5
  1088.         muls    trk_tremsz(a5),d5
  1089.         asr.w   #7,d5
  1090.         move.b  trk_tremspd(a5),d0
  1091.         add.b   d0,trk_tremoffs(a5)
  1092.         move.b  trk_prevvol(a5),d1
  1093.         add.b   d5,d1
  1094.         bpl.s   tre_pos
  1095.         moveq   #0,d1
  1096. tre_pos     cmp.b   #64,d1
  1097.         ble.s   tre_no2hi
  1098.         moveq   #64,d1
  1099. tre_no2hi   move.b  d1,trk_tempvol(a5)
  1100.         bra.w   newvals
  1101. ;   **************************************** Effect 0D/0A ***
  1102. fx_0a:
  1103. fx_0d:      tst.b   d3
  1104.         bne.s   fx_0dnocnt0
  1105.         btst    #5,msng_flags(a4)
  1106.         bne newvals
  1107. fx_0dnocnt0 bsr.s   plr_volslide
  1108.         bra newvals
  1109. ;   ********* VOLUME SLIDE FUNCTION *************************
  1110. plr_volslide    move.b  d4,d0
  1111.         moveq   #0,d1
  1112.         move.b  trk_prevvol(a5),d1 ;move previous vol to d1
  1113.         and.b   #$f0,d0
  1114.         bne.s   crescendo
  1115.         sub.b   d4,d1   ;sub from prev. vol
  1116. voltest0    bpl.s   novolover64
  1117.         moveq   #0,d1   ;volumes under zero not accepted!!!
  1118.         bra.s   novolover64
  1119. crescendo:  lsr.b   #4,d0
  1120.         add.b   d0,d1
  1121. voltest     cmp.b   #64,d1
  1122.         ble.s   novolover64
  1123.         moveq   #64,d1
  1124. novolover64 move.b  d1,trk_prevvol(a5)
  1125.         movea.l trk_audioaddr(a5),a0
  1126.         movea.l ac_vol(a0),a0
  1127.         move.b  d1,(a0)
  1128.         rts
  1129. ;   **************************************** Effect 1A ******
  1130. fx_1a       tst.b   d3
  1131.         bne fx_xx
  1132.         move.b  trk_prevvol(a5),d1
  1133.         add.b   d4,d1
  1134.         bsr.s   voltest
  1135.         bra newvals
  1136. ;   **************************************** Effect 1B ******
  1137. fx_1b       tst.b   d3
  1138.         bne fx_xx
  1139.         move.b  trk_prevvol(a5),d1
  1140.         sub.b   d4,d1
  1141.         bsr.s   voltest0
  1142.         bra newvals
  1143. ;   **************************************** Effect 05 ******
  1144. fx_05:      tst.b   d3
  1145.         bne.s   fx_05nocnt0
  1146.         btst    #5,msng_flags(a4)
  1147.         bne newvals
  1148. fx_05nocnt0 bsr.s   plr_volslide        ;Volume slide
  1149.         bra.s   fx_03nocnt0
  1150. ;   **************************************** Effect 03 ******
  1151. fx_03:      tst.b   d3
  1152.         bne.s   fx_03nocnt0
  1153.         btst    #5,msng_flags(a4)
  1154.         bne newvals
  1155. fx_03nocnt0 move.w  trk_porttrgper(a5),d0   ;d0 = target period
  1156.         beq.w   newvals ;no target period specified
  1157.         move.w  trk_prevper(a5),d1  ;d1 = curr. period
  1158.         move.b  trk_prevportspd(a5),d4  ;get prev. speed
  1159.         cmp.w   d0,d1
  1160.         bhi.s   subper  ;curr. period > target period
  1161.         add.w   d4,d1   ;add the period
  1162.         cmp.w   d0,d1
  1163.         bge.s   targreached
  1164.         bra.s   targnreach
  1165. subper:     sub.w   d4,d1   ;subtract
  1166.         cmp.w   d0,d1   ;compare current period to target period
  1167.         bgt.s   targnreach
  1168. targreached:    move.w  trk_porttrgper(a5),d1 ;eventually push target period
  1169.         clr.w   trk_porttrgper(a5) ;now we can forget everything
  1170. targnreach: move.w  d1,trk_prevper(a5)
  1171.         move.w  d1,d5
  1172.         bra.s   plr_newper
  1173. ;   **************************************** Effect 13 ******
  1174. fx_13:      move.w  trk_prevper(a5),d5 ;this is very simple: get the old period
  1175.         cmp.b   #3,d3       ;and..
  1176.         bge.s   plr_newper  ;if counter < 3
  1177.         sub.w   d4,d5   ;subtract effect qualifier
  1178.         bra.s   plr_newper
  1179. ;   **************************************** Effect 1E ******
  1180. fx_1e       tst.w   blkdelay-DB(a6)
  1181.         bne.s   fx_xx
  1182.         addq.w  #1,d4
  1183.         move.w  d4,blkdelay-DB(a6)
  1184.         bra.s   fx_xx
  1185. ;   **************************************** Effect 18 ******
  1186. fx_18       cmp.b   d4,d3
  1187.         bne fx_xx
  1188.         clr.w   trk_prevper(a5)
  1189.         bra.s   endl
  1190. ;   **************************************** Effect 1F ******
  1191. fx_1f       move.b  d4,d1
  1192.         lsr.b   #4,d4       ;note delay
  1193.         beq.s   nonotedelay
  1194.         cmp.b   d4,d3       ;compare to counter
  1195.         blt.s   fx_xx       ;tick not reached
  1196.         bne.s   nonotedelay
  1197.         bsr playfxnote  ;trigger note
  1198. nonotedelay and.w   #$0f,d1     ;retrig?
  1199.         beq.s   fx_xx
  1200.         moveq   #0,d0
  1201.         move.b  d3,d0
  1202.         divu    d1,d0
  1203.         swap    d0      ;get modulo of counter/tick
  1204.         tst.w   d0
  1205.         bne.s   fx_xx
  1206.         bsr.s   playfxnote  ;retrigger
  1207.         bra.s   fx_xx
  1208. ;   **************************************** Effect 0F ******
  1209. fx_0f:      bsr.s   cmd_F
  1210. ;   *********************************************************
  1211. fx_xx:
  1212. newvals:    move.w  trk_prevper(a5),d5
  1213. plr_newper
  1214. plr_tmpper  movea.l trk_audioaddr(a5),a1    ;get channel address
  1215.         move.w  d5,ac_per(a1)       ;push period
  1216. endl:       addq.b  #1,d7   ;increment channel number
  1217.         cmp.w   numtracks-DB(a6),d7 ;all channels done???
  1218.         blt.w   plr_loop1   ;not yet!!!
  1219.  
  1220. plr_exit8   movem.l (sp)+,d2-d7/a2-a5
  1221.         moveq   #1,d0
  1222.         rts
  1223.  
  1224. cmd_F       cmp.b   #$f1,d4
  1225.         bne.s   no0ff1
  1226.         cmp.b   #3,d3
  1227.         beq.s   playfxnote
  1228.         rts
  1229. no0ff1:     cmp.b   #$f2,d4
  1230.         bne.s   no0ff2
  1231.         cmp.b   #3,d3
  1232.         beq.s   playfxnote
  1233.         rts
  1234. no0ff2:     cmp.b   #$f3,d4
  1235.         bne.s   no0ff3
  1236.         move.b  d3,d0
  1237.         beq.s   cF_rts
  1238.         and.b   #1,d0       ;is 2 or 4
  1239.         bne.s   cF_rts
  1240. playfxnote: moveq   #0,d1
  1241.         move.b  (a5),d1     ;get note # of previous note
  1242.         beq.s   cF_rts
  1243.         move.b  trk_noteoffcnt(a5),d0   ;get hold counter
  1244.         bmi.s   pfxn_nohold     ;no hold, or hold over
  1245.         add.b   d3,d0           ;increase by counter val
  1246.         bra.s   pfxn_hold
  1247. pfxn_nohold move.b  trk_inithold(a5),d0 ;get initial hold
  1248.         bne.s   pfxn_hold
  1249.         st  d0
  1250. pfxn_hold   move.b  d0,trk_noteoffcnt(a5)
  1251.         move.l  d3,-(sp)
  1252.         moveq   #0,d3
  1253.         move.b  trk_previnstr(a5),d3    ;and prev. sample #
  1254.         move.l  a3,-(sp)
  1255.         movea.l trk_previnstra(a5),a3
  1256.         bsr _PlayNote8
  1257.         movea.l (sp)+,a3
  1258.         move.l  (sp)+,d3
  1259. cF_rts      rts
  1260. no0ff3:     cmp.b   #$f4,d4     ;triplet cmd 1
  1261.         bne.s   no0ff4
  1262.         moveq   #0,d0
  1263.         move.b  msng_tempo2(a4),d0
  1264.         divu    #3,d0
  1265.         cmp.b   d0,d3
  1266.         beq.s   playfxnote
  1267.         rts
  1268. no0ff4      cmp.b   #$f5,d4     ;triplet cmd 2
  1269.         bne.s   no0ff5
  1270.         moveq   #0,d0
  1271.         move.b  msng_tempo2(a4),d0
  1272.         divu    #3,d0
  1273.         add.w   d0,d0
  1274.         cmp.b   d0,d3
  1275.         beq.s   playfxnote
  1276.         rts
  1277. no0ff5      cmp.b   #$f8,d4     ;f8 = filter off
  1278.         beq.s   plr_filteroff
  1279.         cmp.b   #$f9,d4     ;f9 = filter on
  1280.         bne.s   cF_rts
  1281.         bclr    #1,$bfe001
  1282.         rts
  1283. plr_filteroff:  bset    #1,$bfe001
  1284.         rts
  1285.  
  1286. _SetTempo:  move.l  _module8-DB(a6),d1
  1287.         beq.s   ST_x
  1288.         movea.l d1,a0
  1289.         movea.l mmd_songinfo(a0),a0
  1290.         move.w  d0,msng_deftempo(a0)
  1291.         tst.w   d0
  1292.         ble.s   ST_maxszcnt
  1293.         cmp.w   #9,d0
  1294.         bls.s   ST_nodef8tempo
  1295. ST_maxszcnt moveq   #10,d0
  1296. ST_nodef8tempo  add.b   #9,d0
  1297.         move.b  d0,currchszcnt-DB+1(a6)
  1298.         lea eightchsizes-10-DB(a6),a0
  1299.         move.b  0(a0,d0.w),d0   ;get buffersize / 2
  1300.         move.w  d0,currchsize2-DB(a6)
  1301.         asl.w   #3,d0       ;get buffersize * 4
  1302.         move.w  d0,currchsize-DB(a6)
  1303. ST_x        rts
  1304.  
  1305. _Rem8chan:  move.l  a6,-(sp)
  1306.         lea DB,a6
  1307.         move.b  eightrkon-DB(a6),d0
  1308.         beq.s   no8init
  1309.         clr.b   eightrkon-DB(a6)
  1310.         move.w  #1<<7,$dff09a
  1311.         moveq   #7,d0
  1312.         move.l  prevaud-DB(a6),d0
  1313.         beq.s   no8init
  1314.         move.l  d0,a1
  1315.         move.l  4,a6
  1316.         jsr -$a2(a6)
  1317. no8init     move.l  (sp)+,a6
  1318.         rts
  1319.  
  1320. _End8Play:  tst.b   play8
  1321.         beq.s   noend8play
  1322.         move.w  #1<<7,$dff09a
  1323.         move.w  #$F,$dff096
  1324.         clr.b   play8
  1325. noend8play  rts
  1326.  
  1327. ; *************************************************************************
  1328. ; *************************************************************************
  1329. ; ***********          P U B L I C   F U N C T I O N S          ***********
  1330. ; *************************************************************************
  1331. ; *************************************************************************
  1332.  
  1333.         xdef    _PlayModule8
  1334.         xdef    _InitPlayer8,_RemPlayer8,_StopPlayer8
  1335.         xdef    _ContModule8
  1336.  
  1337. ; *************************************************************************
  1338. ; InitModule8(a0 = module) -- extract expansion data etc.. from the module
  1339. ; *************************************************************************
  1340.  
  1341. _InitModule8:   movem.l a2-a3/d2,-(sp)
  1342.         move.l  a0,d0
  1343.         beq.w   IM_exit         ;0 => xit
  1344.         lea holdvals-DB(a6),a2
  1345.         movea.l mmd_songinfo(a0),a3
  1346.         move.l  mmd_expdata(a0),d0  ;expdata...
  1347.         beq.s   IM_clrhlddec        ;none here
  1348.         move.l  d0,a1
  1349.         move.l  4(a1),d0        ;exp_smp
  1350.         beq.s   IM_clrhlddec    ;again.. nothing
  1351.         move.l  d0,a0       ;InstrExt...
  1352.         move.w  8(a1),d2    ;# of entries
  1353.         beq.s   IM_clrhlddec
  1354.         subq.w  #1,d2       ;- 1 (for dbf)
  1355.         move.w  10(a1),d0   ;entry size
  1356. IM_loop1    clr.b   63(a2)      ;clear finetune
  1357.         cmp.w   #3,d0
  1358.         ble.s   IM_noftune
  1359.         move.b  3(a0),63(a2)
  1360. IM_noftune  clr.b   126(a2)     ;clear flags
  1361.         cmp.w   #6,d0
  1362.         blt.s   IM_noflags
  1363.         move.b  5(a0),126(a2)   ;InstrExt.flags -> flags
  1364.         bra.s   IM_gotflags
  1365. IM_noflags  cmp.w   #1,inst_replen(a3)
  1366.         bls.s   IM_gotflags
  1367.         bset    #0,126(a2)
  1368. IM_gotflags move.b  (a0),(a2)+  ;InstrExt.hold -> holdvals
  1369.         adda.w  d0,a0       ;ptr to next InstrExt
  1370.         addq.l  #8,a3       ;next instrument...
  1371.         dbf d2,IM_loop1
  1372.         bra.s   IM_exit
  1373. IM_clrhlddec    moveq   #125,d0     ;no InstrExt => clear holdvals/decays
  1374. IM_loop2    clr.b   (a2)+
  1375.         dbf d0,IM_loop2
  1376. ; -------- For (very old) MMDs, with no InstrExt, set flags/SSFLG_LOOP.
  1377.         lea flags,a2
  1378.         moveq   #62,d0
  1379. IM_loop4    cmp.w   #1,inst_replen(a3)
  1380.         bls.s   IM_noreptflg
  1381.         bset    #0,(a2)
  1382. IM_noreptflg    addq.l  #1,a2
  1383.         addq.l  #8,a3       ;next inst
  1384.         dbf d0,IM_loop4
  1385. IM_exit     movem.l (sp)+,a2-a3/d2
  1386.         rts
  1387.  
  1388.  
  1389. ; *************************************************************************
  1390. ; ContModule8(a0 = module) -- continue playing
  1391. ; *************************************************************************
  1392. _ContModule8    bsr.w   _End8Play
  1393.         moveq   #0,d0
  1394.         bra.s   contpoint8
  1395. ; *************************************************************************
  1396. ; PlayModule8(a0 = module)  -- init and play a module
  1397. ; *************************************************************************
  1398. _PlayModule8:   st  d0
  1399. contpoint8  move.l  a6,-(sp)
  1400.         lea DB,a6
  1401.         movem.l a0/d0,-(sp)
  1402.         bsr _InitModule8
  1403.         movem.l (sp)+,a0/d0
  1404.     IFNE    AUDDEV
  1405.         tst.b   audiodevopen-DB(a6)
  1406.         beq PM_end      ;resource allocation failure
  1407.     ENDC
  1408.         move.l  a0,d1
  1409.         beq.w   PM_end      ;module failure
  1410.         bsr.w   _End8Play
  1411.         clr.l   _module8-DB(a6)
  1412.         clr.l   tmpvol-DB(a6)
  1413.         move.w  _modnum8,d1
  1414.         beq.s   PM_modfound
  1415. PM_nextmod  tst.l   mmd_expdata(a0)
  1416.         beq.s   PM_modfound
  1417.         move.l  mmd_expdata(a0),a1
  1418.         tst.l   (a1)
  1419.         beq.s   PM_modfound     ;no more modules here!
  1420.         move.l  (a1),a0
  1421.         subq.w  #1,d1
  1422.         bgt.s   PM_nextmod
  1423. PM_modfound cmp.b   #'T',3(a0)
  1424.         bne.s   PM_nomodT
  1425.         move.b  #'0',3(a0)  ;change MCNT to MCN0
  1426. PM_nomodT   movea.l mmd_songinfo(a0),a1     ;song
  1427.         move.b  msng_tempo2(a1),mmd_counter(a0) ;init counter
  1428.         btst    #0,msng_flags(a1)
  1429.         bne.s   PM_filon
  1430.         bset    #1,$bfe001
  1431.         bra.s   PM_filset
  1432. PM_filon    bclr    #1,$bfe001
  1433. PM_filset   tst.b   d0
  1434.         beq.s   PM_noclr
  1435.         clr.l   mmd_pline(a0)
  1436.         clr.l   rptline-DB(a6)
  1437.         clr.w   blkdelay-DB(a6)
  1438. ; ---------- Set 'pblock' and 'pseq' to correct values...
  1439. PM_noclr    cmp.b   #'2',3(a0)
  1440.         bne.s   PM_oldpbset
  1441.         move.w  mmd_psecnum(a0),d1
  1442.         move.l  a2,-(sp)        ;need extra register
  1443.         movea.l msng_sections(a1),a2
  1444.         add.w   d1,d1
  1445.         move.w  0(a2,d1.w),d1       ;get sequence number
  1446.         add.w   d1,d1
  1447.         add.w   d1,d1
  1448.         move.w  d1,mmd_pseq(a0)
  1449.         movea.l msng_pseqs(a1),a2
  1450.         movea.l 0(a2,d1.w),a2       ;PlaySeq...
  1451.         move.w  mmd_pseqnum(a0),d1
  1452.         add.w   d1,d1
  1453.         move.w  42(a2,d1.w),d1      ;and the correct block..
  1454.         move.l  (sp)+,a2
  1455.         bra.s   PM_setblk
  1456. PM_oldpbset move.w  mmd_pseqnum(a0),d1
  1457.         add.w   #msng_playseq,d1
  1458.         move.b  0(a1,d1.w),d1       ;get first playseq entry
  1459.         ext.w   d1
  1460. PM_setblk   move.w  d1,mmd_pblock(a0)
  1461.         move.w  #-1,mmd_pstate(a0)
  1462.         move.l  a0,_module8-DB(a6)
  1463.         move.l  mmd_expdata(a0),d0
  1464.         beq.s   PM_start
  1465.         movea.l d0,a0
  1466.         lea 36(a0),a0   ;track split mask
  1467.         bsr.s   _SetChMode
  1468. PM_start    bsr.s   _Start8Play
  1469. PM_end      move.l  (sp)+,a6
  1470.         rts
  1471.  
  1472. _SetChMode  ;a0 = address of 4 UBYTEs
  1473.         movem.l a2/d2,-(sp)
  1474.         lea trksplit-DB(a6),a2
  1475.         lea t038+trk_split-DB(a6),a1
  1476.         moveq   #3,d0
  1477.         moveq   #0,d1
  1478. scm_loop    lsr.b   #1,d1
  1479.         move.b  (a0)+,d2
  1480.         beq.s   scm_split
  1481.         moveq   #0,d2
  1482.         bra.s   scm_nosplit
  1483. scm_split   or.b    #8,d1
  1484.         st  d2
  1485. scm_nosplit move.b  d2,(a1)
  1486.         move.b  d2,4*T03SZ(a1)
  1487.         lea T03SZ(a1),a1
  1488.         move.b  d2,(a2)+
  1489.         dbf d0,scm_loop
  1490.         move.w  d1,chdmamask-DB(a6)
  1491.         movem.l (sp)+,a2/d2
  1492. rts:        rts
  1493.  
  1494. _Start8Play:    ;d0 = pstate
  1495.         lea _audiobuff,a0
  1496.         move.w  #1600-1,d1
  1497. clrbuffloop:    clr.w   (a0)+       ;clear track buffers
  1498.         dbf d1,clrbuffloop
  1499.         move.l  _module8-DB(a6),d0
  1500.         beq.s   rts
  1501.         move.l  d0,a0
  1502.         movea.l mmd_songinfo(a0),a0
  1503.         move.w  msng_deftempo(a0),d0    ;get deftempo
  1504.         bsr.w   _SetTempo
  1505.         lea $dff000,a0
  1506.         move.w  currchsize2-DB(a6),d0
  1507.         move.w  d0,$a4(a0)  ;set audio buffer sizes
  1508.         move.w  d0,$b4(a0)  ;according to tempo selection
  1509.         move.w  d0,$c4(a0)
  1510.         move.w  d0,$d4(a0)
  1511.         move.w  #227,d1
  1512.         move.w  d1,$a6(a0)
  1513.         move.w  d1,$b6(a0)
  1514.         move.w  d1,$c6(a0)
  1515.         move.w  d1,$d6(a0)
  1516.         move.l  #_audiobuff,$a0(a0)
  1517.         move.l  #_audiobuff+800,$b0(a0)
  1518.         move.l  #_audiobuff+1600,$c0(a0)
  1519.         move.l  #_audiobuff+2400,$d0(a0)
  1520.         moveq   #64,d1
  1521.         move.w  d1,$a8(a0)
  1522.         move.w  d1,$b8(a0)
  1523.         move.w  d1,$c8(a0)
  1524.         move.w  d1,$d8(a0)
  1525.         clr.b   whichbuff-DB(a6)
  1526.         movea.l 4,a1
  1527.         move.w  #$4000,$9a(a0)
  1528.         addq.b  #1,$126(a1)
  1529.         lea track0hw-DB(a6),a1
  1530.         moveq   #7,d1
  1531. clrtrkloop  clr.l   (a1)
  1532.         clr.w   ac_per(a1)
  1533.         adda.w  #SIZE4TRKHW/4,a1
  1534.         dbf d1,clrtrkloop
  1535.         move.w  #$F,$dff096 ;audio DMA off
  1536.         bsr.w   _Wait1line  ;wait until all stopped
  1537.         st  play8-DB(a6)
  1538.         move.w  #$8080,$9a(a0)
  1539.         move.w  chdmamask-DB(a6),d1
  1540.         bset    #15,d1
  1541.         move.w  d1,$96(a0)
  1542.         movea.l 4,a1
  1543.         subq.b  #1,$126(a1)
  1544.         bge.s   x8play
  1545.         move.w  #$c000,$9a(a0)
  1546. x8play      rts
  1547. ; *************************************************************************
  1548. ; InitPlayer8() -- allocate interrupt, audio, serial port etc...
  1549. ; *************************************************************************
  1550. _InitPlayer8:   bsr.s   _AudioInit
  1551.         tst.l   d0
  1552.         bne.s   IP_error
  1553.         rts
  1554. IP_error    bsr.s   _RemPlayer8
  1555.         moveq   #-1,d0
  1556.         rts
  1557. ; *************************************************************************
  1558. ; StopPlayer8() -- stop music
  1559. ; *************************************************************************
  1560. _StopPlayer8:   move.l  _module8,d0
  1561.         beq.s   SP_nomod
  1562.         movea.l d0,a0
  1563.         clr.w   mmd_pstate(a0)
  1564.         clr.l   _module8
  1565. SP_nomod    bra.w   _End8Play
  1566.  
  1567. ; *************************************************************************
  1568. ; RemPlayer8() -- free interrupt, audio, serial port etc..
  1569. ; *************************************************************************
  1570. _RemPlayer8:    bsr.s   _StopPlayer8
  1571. ;       vvvvvvvvvvvvvvvv  to _AudioRem
  1572. ; *************************************************************************
  1573. _AudioRem:  movem.l a5-a6,-(sp)
  1574.         lea DB,a5
  1575.         bsr.w   _Rem8chan
  1576.     IFNE    AUDDEV
  1577.         movea.l 4,a6
  1578.         tst.b   audiodevopen-DB(a5)
  1579.         beq.s   rem2
  1580.         clr.b   audiodevopen-DB(a5)
  1581.         move.w  #$000f,$dff096  ;stop audio DMA
  1582. ;   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ close audio.device
  1583.         lea allocreq-DB(a5),a1
  1584.         jsr -$1c2(a6)   ;CloseDevice()
  1585. rem2:       moveq   #0,d0
  1586.         move.b  sigbitnum-DB(a5),d0
  1587.         bmi.s   rem3
  1588. ;   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ free signal bit
  1589.         jsr -$150(a6)   ;FreeSignal()
  1590.         st  sigbitnum-DB(a5)
  1591.     ENDC
  1592. rem3:       movem.l (sp)+,a5-a6
  1593.         rts
  1594.  
  1595. _AudioInit: movem.l a4/a6/d2-d3,-(sp)
  1596.         lea DB,a4
  1597.         movea.l 4.w,a6
  1598.     IFNE    AUDDEV
  1599.         moveq   #0,d2
  1600. ;   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ alloc signal bit
  1601.         moveq   #1,d2
  1602.         moveq   #-1,d0
  1603.         jsr -$14a(a6)   ;AllocSignal()
  1604.         tst.b   d0
  1605.         bmi.w   initerr
  1606.         move.b  d0,sigbitnum-DB(a4)
  1607. ;   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ prepare IORequest
  1608.         lea allocport-DB(a4),a1
  1609.         move.b  d0,15(a1)   ;set mp_SigBit
  1610.         move.l  a1,-(sp)
  1611.         suba.l  a1,a1
  1612.         jsr -$126(a6)   ;FindTask(0)
  1613.         move.l  (sp)+,a1
  1614.         move.l  d0,16(a1)   ;set mp_SigTask
  1615.         lea reqlist-DB(a4),a0
  1616.         move.l  a0,(a0)     ;NEWLIST begins...
  1617.         addq.l  #4,(a0)
  1618.         clr.l   4(a0)
  1619.         move.l  a0,8(a0)    ;NEWLIST ends...
  1620. ;   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ open audio.device
  1621.         moveq   #2,d2
  1622.         lea allocreq-DB(a4),a1
  1623.         lea audiodevname-DB(a4),a0
  1624.         moveq   #0,d0
  1625.         moveq   #0,d1
  1626.         jsr -$1bc(a6)   ;OpenDevice()
  1627.         tst.b   d0
  1628.         bne.w   initerr
  1629.         st.b    audiodevopen-DB(a4)
  1630.     ENDC
  1631.         move.w  #1<<7,$dff09a   ;Init 8 channel stuff
  1632.         moveq   #7,d0       ;Audio channel 0 interrupt
  1633.         lea audiointerrupt-DB(a4),a1
  1634.         jsr -$a2(a6)    ;SetIntVector()
  1635.         move.l  d0,prevaud-DB(a4)
  1636.         st  eightrkon-DB(a4)
  1637.         moveq   #0,d0
  1638. initret:    movem.l (sp)+,a4/a6/d2-d3
  1639.         rts
  1640. initerr:    move.l  d2,d0
  1641.         bra.s   initret
  1642.  
  1643.         DATA
  1644. DB:     ;Data base pointer
  1645.     IFNE    AUDDEV
  1646. sigbitnum   dc.b    -1
  1647. audiodevopen    dc.b    0
  1648. allocm      dc.b    $F,0
  1649.     ENDC
  1650. chdmamask   dc.w    0
  1651. trksplit    dc.b    0,0,0,0
  1652.         even
  1653.     IFNE    AUDDEV
  1654. allocport   dc.l    0,0 ;succ, pred
  1655.         dc.b    4,0 ;NT_MSGPORT
  1656.         dc.l    0   ;name
  1657.         dc.b    0,0 ;flags = PA_SIGNAL
  1658.         dc.l    0   ;task
  1659. reqlist     dc.l    0,0,0   ;list head, tail and tailpred
  1660.         dc.b    5,0
  1661. allocreq    dc.l    0,0
  1662.         dc.b    0,127   ;NT_UNKNOWN, use maximum priority (127)
  1663.         dc.l    0,allocport ;name, replyport
  1664.         dc.w    68      ;length
  1665.         dc.l    0   ;io_Device
  1666.         dc.l    0   ;io_Unit
  1667.         dc.w    0   ;io_Command
  1668.         dc.b    0,0 ;io_Flags, io_Error
  1669.         dc.w    0   ;ioa_AllocKey
  1670.         dc.l    allocm  ;ioa_Data
  1671.         dc.l    1   ;ioa_Length
  1672.         dc.w    0,0,0   ;ioa_Period, Volume, Cycles
  1673.         dc.w    0,0,0,0,0,0,0,0,0,0 ;ioa_WriteMsg
  1674. audiodevname    dc.b    'audio.device',0
  1675.     ENDC
  1676.         even
  1677.  
  1678. zerodata    dc.w    0
  1679. whichbuff   dc.w    0
  1680.  
  1681. track0hw    dc.l    0,0,tmpvol,0,0
  1682.         dc.w    $0001,$df,$f0a0
  1683. track1hw    dc.l    0,0,tmpvol+1,0,0
  1684.         dc.w    $0002,$df,$f0b0
  1685. track2hw    dc.l    0,0,tmpvol+2,0,0
  1686.         dc.w    $0004,$df,$f0c0
  1687. track3hw    dc.l    0,0,tmpvol+3,0,0
  1688.         dc.w    $0008,$df,$f0d0
  1689. track4hw    dc.l    0,0,tmpvol,0,0
  1690.         dc.w    0,0,0
  1691. track5hw    dc.l    0,0,tmpvol+1,0,0
  1692.         dc.w    0,0,0
  1693. track6hw    dc.l    0,0,tmpvol+2,0,0
  1694.         dc.w    0,0,0
  1695. track7hw    dc.l    0,0,tmpvol+3,0,0
  1696.         dc.w    0,0,0
  1697. SIZE4TRKHW  equ 4*$1A
  1698.  
  1699. tmpvol      dc.b    0,0,0,0
  1700.  
  1701. audintname  dc.b    'OctaMED AudioInterrupt',0
  1702.         even
  1703. audiointerrupt  dc.w    0,0,0,0,0
  1704.         dc.l    audintname,_audiobuff,_IntHandler8
  1705. prevaud     dc.l    0
  1706. play8       dc.b    0
  1707. eightrkon   dc.b    0
  1708.  
  1709. t038:       ds.b    22
  1710.         dc.l    track0hw
  1711.         ds.b    71
  1712.         dc.b    $ff
  1713.         ds.b    22
  1714.         dc.l    track1hw
  1715.         ds.b    71
  1716.         dc.b    $ff
  1717.         ds.b    22
  1718. t238        dc.l    track2hw
  1719.         ds.b    71
  1720.         dc.b    $ff
  1721.         ds.b    22
  1722.         dc.l    track3hw
  1723.         ds.b    71
  1724.         dc.b    $ff
  1725. t4158       ds.b    22
  1726.         dc.l    track4hw
  1727.         ds.b    71
  1728.         dc.b    $ff
  1729.         ds.b    22
  1730.         dc.l    track5hw
  1731.         ds.b    71
  1732.         dc.b    $ff
  1733.         ds.b    22
  1734. t6158       dc.l    track6hw
  1735.         ds.b    71
  1736.         dc.b    $ff
  1737.         ds.b    22
  1738.         dc.l    track7hw
  1739.         ds.b    71
  1740.         dc.b    $ff
  1741.         
  1742. trackdata8  dc.l    t038,t038+T03SZ,t038+2*T03SZ,t038+3*T03SZ
  1743.         dc.l    t4158,t4158+T03SZ,t4158+2*T03SZ,t4158+3*T03SZ
  1744.  
  1745. blkdelay    dc.w    0   ;block delay (PT PatternDelay)
  1746.  
  1747. eightchsizes    dc.b    110,120,130,140,150,160,170,180,190,200
  1748. currchsize  dc.w    0   ;<< 3
  1749. currchsize2 dc.w    0
  1750. currchszcnt dc.w    0
  1751.  
  1752. nextblock   dc.b    0 ;\ DON'T SEPARATE
  1753. nxtnoclrln  dc.b    0 :/
  1754. numtracks   dc.w    0
  1755. numlines    dc.w    0
  1756. nextblockline   dc.w    0
  1757. rptline     dc.w    0
  1758. rptcounter  dc.w    0
  1759. _module8    dc.l    0
  1760.  
  1761.         EVEN
  1762. holdvals    ds.b    63
  1763. finetunes   ds.b    63
  1764. flags       ds.b    63
  1765.  
  1766.     IFNE    IFFMOCT
  1767.     dc.w    3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1768.     dc.w    1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1769.     ENDC
  1770. per0    dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1771.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1772.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1773.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1774.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1775.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1776.     IFNE    IFFMOCT
  1777.     dc.w    3400,3209,3029,2859,2699,2547,2404,2269,2142,2022,1908,1801
  1778.     dc.w    1700,1605,1515,1430,1349,1274,1202,1135,1071,1011,954,901
  1779.     ENDC
  1780. per1    dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1781.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1782.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1783.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1784.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1785.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1786.     IFNE    IFFMOCT
  1787.     dc.w    3376,3187,3008,2839,2680,2529,2387,2253,2127,2007,1895,1788
  1788.     dc.w    1688,1593,1504,1419,1340,1265,1194,1127,1063,1004,947,894
  1789.     ENDC
  1790. per2    dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1791.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1792.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1793.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1794.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1795.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1796.     IFNE    IFFMOCT
  1797.     dc.w    3352,3164,2986,2819,2660,2511,2370,2237,2112,1993,1881,1776
  1798.     dc.w    1676,1582,1493,1409,1330,1256,1185,1119,1056,997,941,888
  1799.     ENDC
  1800. per3    dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1801.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1802.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1803.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1804.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1805.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1806.     IFNE    IFFMOCT
  1807.     dc.w    3328,3141,2965,2799,2641,2493,2353,2221,2097,1979,1868,1763
  1808.     dc.w    1664,1571,1482,1399,1321,1247,1177,1111,1048,989,934,881
  1809.     ENDC
  1810. per4    dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1811.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1812.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1813.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1814.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1815.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1816.     IFNE    IFFMOCT
  1817.     dc.w    3304,3119,2944,2778,2622,2475,2336,2205,2081,1965,1854,1750
  1818.     dc.w    1652,1559,1472,1389,1311,1238,1168,1103,1041,982,927,875
  1819.     ENDC
  1820. per5    dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1821.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1822.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1823.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1824.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1825.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1826.     IFNE    IFFMOCT
  1827.     dc.w    3280,3096,2922,2758,2603,2457,2319,2189,2066,1950,1841,1738
  1828.     dc.w    1640,1548,1461,1379,1302,1229,1160,1095,1033,975,920,869
  1829.     ENDC
  1830. per6    dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1831.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1832.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1833.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1834.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1835.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1836.     IFNE    IFFMOCT
  1837.     dc.w    3256,3073,2901,2738,2584,2439,2302,2173,2051,1936,1827,1725
  1838.     dc.w    1628,1537,1450,1369,1292,1220,1151,1087,1026,968,914,862
  1839.     ENDC
  1840. per7    dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1841.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1842.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1843.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1844.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1845.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1846.     IFNE    IFFMOCT
  1847.     dc.w    3628,3424,3232,3051,2880,2718,2565,2421,2285,2157,2036,1922
  1848.     dc.w    1814,1712,1616,1525,1440,1359,1283,1211,1143,1079,1018,961
  1849.     ENDC
  1850. per_8   dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1851.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1852.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1853.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1854.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1855.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1856.     IFNE    IFFMOCT
  1857.     dc.w    3588,3387,3197,3017,2848,2688,2537,2395,2260,2133,2014,1901
  1858.     dc.w    1794,1693,1598,1509,1424,1344,1269,1197,1130,1067,1007,950
  1859.     ENDC
  1860. per_7   dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1861.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1862.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1863.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1864.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1865.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1866.     IFNE    IFFMOCT
  1867.     dc.w    3576,3375,3186,3007,2838,2679,2529,2387,2253,2126,2007,1894
  1868.     dc.w    1788,1688,1593,1504,1419,1339,1264,1193,1126,1063,1003,947
  1869.     ENDC
  1870. per_6   dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1871.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1872.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1873.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1874.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1875.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1876.     IFNE    IFFMOCT
  1877.     dc.w    3548,3349,3161,2984,2816,2658,2509,2368,2235,2110,1991,1879
  1878.     dc.w    1774,1674,1580,1492,1408,1329,1254,1184,1118,1055,996,940
  1879.     ENDC
  1880. per_5   dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1881.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1882.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1883.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1884.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1885.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1886.     IFNE    IFFMOCT
  1887.     dc.w    3524,3326,3140,2963,2797,2640,2492,2352,2220,2095,1978,1867
  1888.     dc.w    1762,1663,1570,1482,1399,1320,1246,1176,1110,1048,989,933
  1889.     ENDC
  1890. per_4   dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1891.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1892.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1893.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1894.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1895.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1896.     IFNE    IFFMOCT
  1897.     dc.w    3500,3304,3118,2943,2778,2622,2475,2336,2205,2081,1964,1854
  1898.     dc.w    1750,1652,1559,1472,1389,1311,1237,1168,1102,1041,982,927
  1899.     ENDC
  1900. per_3   dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1901.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1902.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1903.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1904.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1905.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1906.     IFNE    IFFMOCT
  1907.     dc.w    3472,3277,3093,2920,2756,2601,2455,2317,2187,2064,1949,1839
  1908.     dc.w    1736,1639,1547,1460,1378,1301,1228,1159,1094,1032,974,920
  1909.     ENDC
  1910. per_2   dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1911.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1912.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1913.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1914.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1915.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1916.     IFNE    IFFMOCT
  1917.     dc.w    3448,3254,3072,2899,2737,2583,2438,2301,2172,2050,1935,1827
  1918.     dc.w    1724,1627,1536,1450,1368,1292,1219,1151,1086,1025,968,913
  1919.     ENDC
  1920. per_1   dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1921.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1922.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1923.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1924.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1925.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1926.  
  1927. _periodtable
  1928.     dc.l    per_8,per_7,per_6,per_5,per_4,per_3,per_2,per_1,per0
  1929.     dc.l    per1,per2,per3,per4,per5,per6,per7
  1930.  
  1931.     IFND    __G2
  1932.         section "datachip",bss,chip ;for A68k
  1933.     ENDC
  1934.     IFD __G2
  1935.         section "datachip",bss_c ;this is for Devpac 2
  1936.     ENDC
  1937.  
  1938.         XDEF    _modnum8
  1939. _audiobuff: ds.w    200*8
  1940. _modnum8:   ds.w    1
  1941. _chipzero:  ds.w    1
  1942.  
  1943. ; the track-data structure definition:
  1944. trk_prevnote    EQU 0   ;previous note number
  1945. trk_previnstr   EQU 1   ;previous instrument number
  1946. trk_prevvol EQU 2   ;previous volume
  1947. trk_prevmidich  EQU 3   ;previous MIDI channel
  1948. trk_cmd     EQU 4   ;command (the 3rd number from right)
  1949. trk_cmdqual EQU 5   ;command qualifier (infobyte, databyte..)
  1950. trk_prevmidin   EQU 6   ;previous MIDI note
  1951. trk_noteoffcnt  EQU 7   ;note-off counter (hold)
  1952. trk_inithold    EQU 8   ;default hold for this instrument
  1953. trk_initdecay   EQU 9   ;default decay for....
  1954. trk_stransp EQU 10  ;instrument transpose
  1955. trk_finetune    EQU 11  ;finetune
  1956. trk_soffset EQU 12  ;new sample offset
  1957. trk_previnstra  EQU 14  ;address of the previous instrument data
  1958. trk_trackvol    EQU 18
  1959. ;   the following data only on tracks 0 - 3
  1960. trk_prevper EQU 20  ;previous period
  1961. trk_audioaddr   EQU 22  ;hardware audio channel base address
  1962. trk_sampleptr   EQU 26  ;pointer to sample
  1963. trk_samplelen   EQU 30  ;length (>> 1)
  1964. trk_porttrgper  EQU 32  ;portamento (cmd 3) target period
  1965. trk_vibshift    EQU 34  ;vibrato shift for ASR instruction
  1966. trk_vibrspd EQU 35  ;vibrato speed/size (cmd 4 qualifier)
  1967. trk_vibrsz  EQU 36  ;vibrato size
  1968. trk_synthptr    EQU 38  ;pointer to synthetic/hybrid instrument
  1969. trk_arpgoffs    EQU 42  ;SYNTH: current arpeggio offset
  1970. trk_arpsoffs    EQU 44  ;SYNTH: arpeggio restart offset
  1971. trk_volxcnt EQU 46  ;SYNTH: volume execute counter
  1972. trk_wfxcnt  EQU 47  ;SYNTH: waveform execute counter
  1973. trk_volcmd  EQU 48  ;SYNTH: volume command pointer
  1974. trk_wfcmd   EQU 50  ;SYNTH: waveform command pointer
  1975. trk_volwait EQU 52  ;SYNTH: counter for WAI (volume list)
  1976. trk_wfwait  EQU 53  ;SYNTH: counter for WAI (waveform list)
  1977. trk_synthvibspd EQU 54  ;SYNTH: vibrato speed
  1978. trk_wfchgspd    EQU 56  ;SYNTH: period change
  1979. trk_perchg  EQU 58  ;SYNTH: curr. period change from trk_prevper
  1980. trk_envptr  EQU 60  ;SYNTH: envelope waveform pointer
  1981. trk_synvibdep   EQU 64  ;SYNTH: vibrato depth
  1982. trk_synvibwf    EQU 66       ;SYNTH: vibrato waveform
  1983. trk_synviboffs  EQU 70  ;SYNTH: vibrato pointer
  1984. trk_initvolxspd EQU 72  ;SYNTH: volume execute speed
  1985. trk_initwfxspd  EQU 73  ;SYNTH: waveform execute speed
  1986. trk_volchgspd   EQU 74  ;SYNTH: volume change
  1987. trk_prevnote2   EQU 75  ;SYNTH: previous note
  1988. trk_synvol  EQU 76  ;SYNTH: current volume
  1989. trk_synthtype   EQU 77  ;>0 = synth, -1 = hybrid, 0 = no synth
  1990. trk_periodtbl   EQU 78  ;pointer to period table
  1991. trk_prevportspd EQU 82  ;portamento (cmd 3) speed
  1992. trk_decay   EQU 84  ;decay
  1993. trk_fadespd EQU 85  ;decay speed
  1994. trk_envrestart  EQU 86  ;SYNTH: envelope waveform restart point
  1995. trk_envcount    EQU 90  ;SYNTH: envelope counter
  1996. trk_split   EQU 91  ;0 = this channel not splitted (OctaMED V2)
  1997. trk_vibroffs    EQU 92  ;vibrato table offset \ DON'T SEPARATE
  1998. trk_tremoffs    EQU 93  ;tremolo table offset /
  1999. trk_tremsz  EQU 94  ;tremolo size
  2000. trk_tremspd EQU 96  ;tremolo speed
  2001. trk_tempvol EQU 97  ;temporary volume (for tremolo)
  2002.         END